// Copyright (c) Microsoft
// All rights reserved
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT.
// See the Apache Version 2.0 License for specific language governing permissions and limitations under the License.
#pragma once
/**********************************************************************************
* inc\amp.operators.h
*
* Defines additional operators for the data types defined in amp.h.
**********************************************************************************/

#include <amp.h>

namespace Concurrency
{
    namespace Test
    {

        ///<summary>Formats an index for display</summary>
        template<int _Rank>
        std::ostream& operator<<(std::ostream &os, const concurrency::index<_Rank> &index)
        {
            os << "index<" << _Rank << ">(";
            for (int i = 0; i < _Rank; i++)
            {
                os << index[i];
                if (i != _Rank -1)
                {
                    os << ", ";
                }
            }
            os << ")";
            return os;
        };

        ///<summary>Formats an extent for display</summary>
        template<int _Rank>
        std::ostream& operator<<(std::ostream &os, const concurrency::extent<_Rank> &extent)
        {
            os << "extent<" << _Rank << ">(";
            for (int i = 0; i < _Rank; i++)
            {
                os << extent[i];
                if (i != _Rank -1)
                {
                    os << ", ";
                }
            }
            os << ")";
            return os;
        };

    }
}

